Auto ScalingのTermination Policyを使いこなそう
こんにちは、虎塚です。
先日、「Auto Scalingがスケールインする時には、最も古いインスタンスから削除されますよね?」というお問合せをいただきました。じつは、スケールイン時にどのインスタンスが終了されるかは、Auto ScalingのTermination Policyをどのように設定したかによって変わります。
今回は、Termination Protectionの種類と動作についてご紹介します。
Auto ScalingのTermination Policyとは
Termination Policyとは、Auto Scalingでスケールインが発生した時に、どのインスタンスを終了させるかを決めるものです。Termination Policyを明示的に指定しない場合は、デフォルトのTermination Policyが使われます。
どのインスタンスを残して、どのインスタンスを消すかは、スケールアウト/スケールインの利用目的によって異なります。Termination Policyを使うと、終了させるインスタンスを柔軟に選定できるので、Auto Scalingをさらに便利に使えるでしょう。
デフォルトのTermination Policy
デフォルトのTermination Policyで終了するインスタンスがどのように選ばれるかを、次の図に示します。
- インスタンスが複数のAvailability Zone (以下、AZ) にある場合、より多くのインスタンスがあり、スケールインから保護されていないインスタンス1が1個以上あるAZを選びます。もし当てはまるAZが複数あったり、インスタンスが単独のAZにあったりする場合は、最も古いLaunch Configurationを使用しているインスタンスがあるAZを選びます。
- 1で選んだAZの中で、スケールインから保護されていなくて、最も古いLaunch Configurationを使用しているインスタンスが1個かを確認します。もしそうなら、そのインスタンスを終了します。
- スケールインから保護されていなくて、最も古いLaunch Configurationを使用しているインスタンスが複数ある場合は、次回の請求時間に最も近いインスタンスを選びます(この方針で選択した場合、ユーザのインスタンス使用期間を最大化しつつ、請求対象になる利用時間を最小化できます)。当てはまるインスタンスが1個であれば、そのインスタンスを終了します。
- スケールインから保護されていなくて、最も古いLaunch Configurationを使用していて、かつ次の請求開始時間まで最も近いインスタンスが2個以上ある場合は、ランダムに1個のインスタンスを終了します。
カスタムのTermination Policy
サポートされているTermination Policyを、AWS CLIで取得できます。
aws autoscaling describe-termination-policy-types { "TerminationPolicyTypes": [ "ClosestToNextInstanceHour", "Default", "NewestInstance", "OldestInstance", "OldestLaunchConfiguration" ] }
上の実行結果は、2016年7月7日時点のものです。それぞれのTermination Policyの詳細を次の表に示します。
ポリシー | 振る舞い | どんな時に便利か |
---|---|---|
OldestInstance | 最も古いインスタンスを終了する | インスタンスタイプを変更する時 |
NewestInstance | 最も新しいインスタンスを終了する | 新しいlaunch configurationをテストしたい(が本番環境として使い続けたくはない)時 |
OldestLaunchConfiguration | 最も古いlaunch configurationを使用しているインスタンスを終了する | Auto Scaling groupをアップデートして、以前のlaunch configurationを利用するインスタンスを置き換えたい時 |
ClosestToNextInstanceHour | 次の請求時間に最も近いインスタンスを終了する | インスタンスの利用量を最大化しつつコストを抑えたい時 |
Default | 上の図を参照 | Auto Scaling groupに1個以上のスケーリングポリシーを関連づけている時 |
カスタムTermination Policyを使用した場合も、最初に評価されるのはAZ間の均衡であることに注意してください。ほかのAZよりもインスタンス数が多いAZがある場合、カスタムのTermination Policyは、まずそのAZに対して適用されます。
実験: インスタンス数が均衡/不均衡な状態でNewestInstanceポリシーを適用
少し長くなりますが、カスタムTermination Policyを適用した時の動作を確認してみましょう。
1. Launch Configurationの作成
t2.microのAmazon Linuxを起動するLaunch Configuration (lc20160707) を作成します。
aws autoscaling create-launch-configuration --cli-input-json file://lc20160707.json
{ "LaunchConfigurationName": "lc20160707", "ImageId": "ami-374db956", "KeyName": "sample-key", "SecurityGroups": [ "sg-00000000", "sg-11111111" ], "InstanceType": "t2.micro", "BlockDeviceMappings": [ { "DeviceName": "/dev/xvda", "Ebs": { "VolumeSize": 8, "VolumeType": "gp2", "DeleteOnTermination": true } } ], "InstanceMonitoring": { "Enabled": false }, "IamInstanceProfile": "sample-role", "EbsOptimized": false, "AssociatePublicIpAddress": true }
2. Auto Scaling groupの作成
ステップ1で作成したLaunch Configurationを使って、VPC内で最大3台・最小3台のインスタンスをMuti-AZで起動するAuto Scaling group (asg20160707) を作成します。
aws autoscaling create-auto-scaling-group --cli-input-json file://asg20160707.json
{ "AutoScalingGroupName": "asg20160707", "LaunchConfigurationName": "lc20160707", "MinSize": 3, "MaxSize": 3, "AvailabilityZones": [ "ap-northeast-1a", "ap-northeast-1c" ], "HealthCheckType": "EC2", "HealthCheckGracePeriod": 180, "VPCZoneIdentifier": "subnet-00000000,subnet-11111111", "NewInstancesProtectedFromScaleIn": false, "Tags": [ { "ResourceId": "asg20160707", "ResourceType": "auto-scaling-group", "Key": "Name", "Value": "termination-policy-test", "PropagateAtLaunch": true } ] }
上では、Auto Scaling groupを作る際に、Termination Policyを明示的に与えていません。DefaultのTermination Policyが使われていることを確認しておきます。
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names asg20160707 | jq '.AutoScalingGroups[].TerminationPolicies' [ "Default" ]
3. 起動したインスタンスの確認
ステップ2で作ったAuto Scaling group内で、インスタンスが自動的に起動します。起動したインスタンスがどのAZにあるかを確認します。
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names asg20160707 | jq '.AutoScalingGroups[].Instances[] | .AvailabilityZone, .InstanceId' "ap-northeast-1a" "i-0d5f1992" "ap-northeast-1a" "i-0e5f1991" "ap-northeast-1c" "i-91fdc11e"
ap-northeast-1aに2台、ap-northeast-1cに1台のインスタンスがあります。
4. インスタンス1台を入れ替え
以降の検証の準備として、インスタンスが1台だけあるAZで、インスタンスを停止します。
aws ec2 stop-instances --instance-ids i-91fdc11e
Auto Scalingのアクティビティを確認します。
aws autoscaling describe-scaling-activities --auto-scaling-group-name asg20160707 | jq '.Activities[].Description' "Launching a new EC2 instance: i-30fcc0bf" "Terminating EC2 instance: i-91fdc11e" "Launching a new EC2 instance: i-0e5f1991" "Launching a new EC2 instance: i-0d5f1992" "Launching a new EC2 instance: i-91fdc11e"
インスタンス (i-91fdc11e) を停止したためにヘルスチェックが通らなくなり、対象インスタンスがAuto Scalingによって終了されました。代わりに、新しいインスタンス (i-30fcc0bf) が起動しました。
新しいインスタンスがどのAZにあるかを確認します。たった今起動したインスタンスは、インスタンスが1個のAZのほうにあります。
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names asg20160707 | jq '.AutoScalingGroups[].Instances[] | .AvailabilityZone, .InstanceId' "ap-northeast-1c" "i-30fcc0bf" "ap-northeast-1a" "i-0d5f1992" "ap-northeast-1a" "i-0e5f1991"
5. Termination Policyの変更 (Default -> NewestInstance)
Termination PolicyをDefaultからNewestInstanceに変更します。NewestInstanceポリシーは、前掲の表のとおり最も新しいインスタンスを終了対象とします。
Termination Policyを変更するには、Auto Scaling groupをアップデートします。
aws autoscaling update-auto-scaling-group --auto-scaling-group-name asg20160707 --termination-policies "NewestInstance"
新しいカスタムTermination Policyが適用されたことを確認します。
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names asg20160707 | jq '.AutoScalingGroups[].TerminationPolicies' [ "NewestInstance" ]
6. インスタンス数が不均衡な状態でのスケールイン
Auto Scaling groupをシュリンクさせて、どのインスタンスが終了されるかを確認しましょう。
aws autoscaling update-auto-scaling-group --auto-scaling-group-name asg20160707 --min-size 2 --max-size 2
NewestInstanceポリシーを適用したので、ap-northeast-1cの最も新しいインスタンス (i-30fcc0bf) が終了されるのでしょうか?
aws autoscaling describe-scaling-activities --auto-scaling-group-name asg20160707 | jq '.Activities[].Description' "Terminating EC2 instance: i-0d5f1992" "Launching a new EC2 instance: i-30fcc0bf" # ap-northeast-1c "Terminating EC2 instance: i-91fdc11e" "Launching a new EC2 instance: i-0e5f1991" # ap-northeast-1a "Launching a new EC2 instance: i-0d5f1992" # ap-northeast-1a "Launching a new EC2 instance: i-91fdc11e"
もちろん、違います。複数AZ間でインスタンス数が不均衡な状態なので、台数が多いほうのAZ (ap-northeast-1a) で、最も新しいインスタンス (i-0d5f1992) が終了されました。
7. Auto Scaling groupのキャパシティを4に変更
以降の検証にそなえて、Auto Scaling groupを最大4台・最小4台のキャパシティに変更します。
aws autoscaling update-auto-scaling-group --auto-scaling-group-name asg20160707 --min-size 4 --max-size 4
新しいインスタンスが自動的に起動します。Auto Scalingのアクティビティを確認しましょう。
aws autoscaling describe-scaling-activities --auto-scaling-group-name asg20160707 | jq '.Activities[].Description' "Launching a new EC2 instance: i-2d5d1bb2" "Launching a new EC2 instance: i-54fec2db" "Terminating EC2 instance: i-0d5f1992" "Launching a new EC2 instance: i-30fcc0bf" # ap-northeast-1c "Terminating EC2 instance: i-91fdc11e" "Launching a new EC2 instance: i-0e5f1991" # ap-northeast-1a "Launching a new EC2 instance: i-0d5f1992" "Launching a new EC2 instance: i-91fdc11e"
新しく起動したインスタンスとAZの関連を確認しておきます。
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names asg20160707 | jq '.AutoScalingGroups[].Instances[] | .AvailabilityZone, .InstanceId' "ap-northeast-1a" "i-0e5f1991" "ap-northeast-1a" "i-2d5d1bb2" "ap-northeast-1c" "i-30fcc0bf" "ap-northeast-1c" "i-54fec2db"
ap-northeast-1aに2台、ap-northeast-1cに2台、合計4台のインスタンスが起動しています。
8. インスタンス数が均衡している状態でのスケールイン
Auto Scaling groupをふたたび変更して、最大3台・最小3台の設定に戻します。つまり、現在起動しているインスタンスのうち、どれか1台が終了されることになります。
aws autoscaling update-auto-scaling-group --auto-scaling-group-name asg20160707 --min-size 3 --max-size 3
Auto Scalingのアクティビティで、どのインスタンスが終了されたかを確認しますしょう。
aws autoscaling describe-scaling-activities --auto-scaling-group-name asg20160707 | jq '.Activities[].Description' "Terminating EC2 instance: i-2d5d1bb2" "Launching a new EC2 instance: i-2d5d1bb2" # ap-northeast-1a "Launching a new EC2 instance: i-54fec2db" # ap-northeast-1c "Terminating EC2 instance: i-0d5f1992" "Launching a new EC2 instance: i-30fcc0bf" # ap-northeast-1c "Terminating EC2 instance: i-91fdc11e" "Launching a new EC2 instance: i-0e5f1991" # ap-northeast-1a "Launching a new EC2 instance: i-0d5f1992" "Launching a new EC2 instance: i-91fdc11e"
AZ間でインスタンス数が均衡を保っている状態では、NewestInsntanceというポリシー名どおり、最も新しいインスタンス (i-2d5d1bb2) が削除されました。
おわりに
カスタムTermination Policyの表にあるように、それぞれのポリシーには使いどころがあります。目的にあわせてTermination Policyを設定し、Auto Scalingをもっと便利に使いましょう。
それでは、また。